 /*******************************************************************************
  * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.navigator.resources.actions;

 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.mapping.ResourceMapping;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.jface.action.GroupMarker;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.actions.OpenFileAction;
 import org.eclipse.ui.actions.OpenWithMenu;
 import org.eclipse.ui.internal.navigator.AdaptabilityUtility;
 import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
 import org.eclipse.ui.navigator.CommonActionProvider;
 import org.eclipse.ui.navigator.ICommonActionConstants;
 import org.eclipse.ui.navigator.ICommonActionExtensionSite;
 import org.eclipse.ui.navigator.ICommonMenuConstants;
 import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;

 /**
  * Provides the open and open with menus for IResources.
  *
  * @since 3.2
  *
  */
 public class OpenActionProvider extends CommonActionProvider {

     private OpenFileAction openFileAction;

     private ICommonViewerWorkbenchSite viewSite = null;

     private boolean contribute = false;

     public void init(ICommonActionExtensionSite aConfig) {
         if (aConfig.getViewSite() instanceof ICommonViewerWorkbenchSite) {
             viewSite = (ICommonViewerWorkbenchSite) aConfig.getViewSite();
             openFileAction = new OpenFileAction(viewSite.getPage());
             contribute = true;
         }
     }

     public void fillContextMenu(IMenuManager aMenu) {
         if (!contribute || getContext().getSelection().isEmpty()) {
             return;
         }

         IStructuredSelection selection = (IStructuredSelection) getContext()
                 .getSelection();

         openFileAction.selectionChanged(selection);
         if (openFileAction.isEnabled()) {
             aMenu.insertAfter(ICommonMenuConstants.GROUP_OPEN, openFileAction);
         }
         addOpenWithMenu(aMenu);
     }

     public void fillActionBars(IActionBars theActionBars) {
         if (!contribute) {
             return;
         }
         IStructuredSelection selection = (IStructuredSelection) getContext()
                 .getSelection();
         if (selection.size() == 1
                 && selection.getFirstElement() instanceof IFile) {
             openFileAction.selectionChanged(selection);
             theActionBars.setGlobalActionHandler(ICommonActionConstants.OPEN,
                     openFileAction);
         }

     }

     private void addOpenWithMenu(IMenuManager aMenu) {
         IStructuredSelection ss = (IStructuredSelection) getContext()
                 .getSelection();

         if (ss == null || ss.size() != 1) {
             return;
         }

         Object o = ss.getFirstElement();

         // first try IResource
 IAdaptable openable = (IAdaptable) AdaptabilityUtility.getAdapter(o,
                 IResource.class);
         // otherwise try ResourceMapping
 if (openable == null) {
             openable = (IAdaptable) AdaptabilityUtility.getAdapter(o,
                     ResourceMapping.class);
         } else if (((IResource) openable).getType() != IResource.FILE) {
             openable = null;
         }

         if (openable != null) {
             // Create a menu flyout.
 IMenuManager submenu = new MenuManager(
                     WorkbenchNavigatorMessages.OpenActionProvider_OpenWithMenu_label,
                     ICommonMenuConstants.GROUP_OPEN_WITH);
             submenu.add(new GroupMarker(ICommonMenuConstants.GROUP_TOP));
             submenu.add(new OpenWithMenu(viewSite.getPage(), openable));
             submenu.add(new GroupMarker(ICommonMenuConstants.GROUP_ADDITIONS));

             // Add the submenu.
 if (submenu.getItems().length > 2 && submenu.isEnabled()) {
                 aMenu.appendToGroup(ICommonMenuConstants.GROUP_OPEN_WITH,
                         submenu);
             }
         }
     }

 }

